import def from "./utils";
import defineReactive from "./defineReactive";
import { arrayMethods } from "./array.js";
import observe from "./observe";
import Dep from "./Dep";

export default class Observer {
  constructor(value) {
    // 每一个Observer的实例身上，都有一个dep
    this.dep = new Dep();

    // 给实例（this，一定要注意，构造函数中的this不是表示类本身，而是表示实例）
    // 添加了__ob__属性，值是这次new的实例
    def(value, "__ob__", this, false);
    // console.log("我是Observer构造器", value);
    // 不要忘记初心，Observer类的目的是：将一个正常的object转换为
    // 每个层级的属性都是响应式（可以被侦测的）的object
    // 检查是数组还是对象

    if (Array.isArray(value)) {
      value.__proto__ = arrayMethods;
      this.observeArray(value);
    } else {
      this.walk(value);
    }

  }

  //   普通递归遍历
  walk(target) {
    // console.log(value);
    for (let key in target) {
      defineReactive(target, key);
    }
  }
  // 数组递归遍历
  observeArray(arr) {
    for (let i = 0, l = arr.length; i < l; i++) {
      observe(arr[i])
    }
  }
}
